package com.qf.controller;

import com.qf.entity.Order;
import com.qf.entity.User;
import com.qf.entity.custom.OrderCustom;
import com.qf.service.OrderService;
import com.qf.tools.JavaWebToken;
import com.qf.tools.ResponseUtils;
import com.qf.tools.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * @author: ZhangYubin
 * @date: 2020/7/23 21:43
 * @description:
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    /**
     * 用户所有订单：
     * 以实体类对象形式接收前端数据，传回包含id信息和token信息的dessertmenu实体
     * 信息，通过id查询详细信息
     * 返回的一条详细信息的数据
     * 若查询数据为空，返回失败信息；
     * 数据不为空，返回成功信息和数据
     *
     * @param user user实体类接收json字符串
     * @return 返回ResultEntity类型的成功或者失败信息并选择是否需要携带数据
     * @throws Exception
     */
    @RequestMapping(value = "/getOrderByUserId", method = RequestMethod.POST)
    public ResultEntity getOrderByUserId(@RequestBody User user) throws Exception {

        String token = user.getToken();
        Map<String, Object> map = JavaWebToken.parserJavaWebToken(token);
        Integer userId = (Integer) map.get("userId");
        if (userId != null) {
            List<Order> ordersByUserId = orderService.getOrdersByUserId(userId);
//            List<Order> ordersByUserId = orderService.getOrdersByUserId(id);
            if (ordersByUserId != null) {
                return ResultEntity.success(ordersByUserId);
            } else {
                return ResponseUtils.responseClinet(false);
            }
        } else {
            return ResponseUtils.responseClinet(false);
        }
    }


    /**
     * 用户下订单接口：
     * 以实体类对象形式接收前端数据，传回token信息的OrderCustom实体信息
     * 若查询数据为空，返回失败信息；
     * 数据不为空，返回成功信息和数据
     *
     * @param order order实体类接收json字符串
     * @return 返回ResultEntity类型的成功或者失败信息并选择是否需要携带数据
     * @throws Exception
     */
    @RequestMapping(value = "/getOrderByNopayStatus", method = RequestMethod.POST)
    public ResultEntity getOrderByNopayStatus(@RequestBody OrderCustom order) throws Exception {

        String token = order.getToken();
        Map<String, Object> map = JavaWebToken.parserJavaWebToken(token);
        Integer userId = (Integer) map.get("userId");
        order.setUserId(userId);
        String status = "待支付";
        order.setOrdersstatus(status);
        if (userId != null) {
            List<Order> ordersByStatus = orderService.getOrdersByStatus(order.getUserId(),order.getOrdersstatus());
            if (ordersByStatus != null) {
                return ResultEntity.success(ordersByStatus);
            } else {
                return ResponseUtils.responseClinet(false);
            }
        } else {
            return ResponseUtils.responseClinet(false);
        }
    }

    /**
     * 用户付款接口：
     * 以实体类对象形式接收前端数据，传回token信息的OrderCustom实体信息
     * 若查询数据为空，返回失败信息；
     * 数据不为空，返回成功信息和数据
     *
     * @param order order实体类接收json字符串
     * @return 返回ResultEntity类型的成功或者失败信息并选择是否需要携带数据
     * @throws Exception
     */
    @RequestMapping(value = "/getOrderByTransitStatus", method = RequestMethod.POST)
    public ResultEntity getOrderByTransitStatus(@RequestBody OrderCustom order) throws Exception {

        String token = order.getToken();
        Map<String, Object> map = JavaWebToken.parserJavaWebToken(token);
        Integer userId = (Integer) map.get("userId");
        order.setUserId(userId);
        order.setOrdersstatus("运输中");
        if (userId != null) {
            List<Order> ordersByStatus = orderService.getOrdersByStatus(order.getUserId(),order.getOrdersstatus());
            if (ordersByStatus != null) {
                return ResultEntity.success(ordersByStatus);
            } else {
                return ResponseUtils.responseClinet(false);
            }
        } else {
            return ResponseUtils.responseClinet(false);
        }
    }

    /**
     * 用户确认收货接口：
     * 以实体类对象形式接收前端数据，传回token信息的OrderCustom实体信息
     * 若查询数据为空，返回失败信息；
     * 数据不为空，返回成功信息和数据
     *
     * @param order order实体类接收json字符串
     * @return 返回ResultEntity类型的成功或者失败信息并选择是否需要携带数据
     * @throws Exception
     */
    @RequestMapping(value = "/getOrderByNoPointStatus", method = RequestMethod.POST)
    public ResultEntity getOrderByNoPointStatus(@RequestBody OrderCustom order) throws Exception {

        String token = order.getToken();
        Map<String, Object> map = JavaWebToken.parserJavaWebToken(token);
        Integer userId = (Integer) map.get("userId");
        order.setUserId(userId);
        order.setOrdersstatus("待评价");
        if (userId != null) {
            List<Order> ordersByStatus = orderService.getOrdersByStatus(order.getUserId(),order.getOrdersstatus());
            if (ordersByStatus != null) {
                return ResultEntity.success(ordersByStatus);
            } else {
                return ResponseUtils.responseClinet(false);
            }
        } else {
            return ResponseUtils.responseClinet(false);
        }
    }

    /**
     * 提交订单接口：从token中解析用户id 判断两个实体对象是否为空
     * 若为空 返回失败信息
     * 若不为空 进行添加订单操作
     * 判断返回值是否为1
     * 若不为1 返回操作失败信息
     * 若为1 进行删除用户已用优惠券操作
     * 判断删除操作是否成功 并返回成功或者失败的信息
     *
     * @param order 对应order实体类 接收提交的订单数据
     * @return 返回一个提交成功和失败的信息
     */
    @RequestMapping(value = "/commitOrder", method = RequestMethod.POST)
    public ResultEntity commitOrder(@RequestBody OrderCustom order) {
        if (order != null) {
            String token = order.getToken();
            Map<String, Object> stringObjectMap = JavaWebToken.parserJavaWebToken(token);
            Integer userId = (Integer) stringObjectMap.get("userId");
            order.setUserId(userId);
            int i = orderService.addOrder(order);
            if (i == 1) {
                return ResponseUtils.responseClinet(true);
            } else {
                return ResponseUtils.responseClinet(false);
            }
        } else {
            return ResponseUtils.responseClinet(false);
        }
    }
}
